/*******************************************************************************
 * FilePath    : /Software/Examples/Andrew/AH_master_uart/Src/User/User_Ble.c
 * Version     : 1.0
 * Brief       :
 * Author      : AndrewHu
 * Company     : Shanghai MacroGiga Electronics CO.,Ltd
 * Email       : Hubinbo@macrogiga.com
 * Date        : 2020-04-03 15:06:14
 * LastEditors : AndrewHu
 * LastEditTime: 2022-02-16 17:43:04
 * Description :
 ******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include <Includes.h>
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define notify_data_MAX 200
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
static u8 ble_mac_addr[6];
static u8 ble_adv_data[32]; //最后一个字节存广播数据长度
static u8 dev_adva[6] = {   //待连接蓝牙设备地址
    0x87, 0xae, 0xc2, 0x37, 0x67, 0xED};
// 0xFF, 0xe5, 0xbb, 0x39, 0x67, 0xED};
//数据传输
u8 notify_index_in = 0x00;
u8 notify_index_out = 0x00;
u8 notify_data[notify_data_MAX] = {0}; // notify缓存
/* Private function ----------------------------------------------------------*/
/* extern --------------------------------------------------------------------*/
extern u8 DeviceInfo[];

/*******************************************************************************
 * Function    : GetAdvData
 * Brief       : 获取广播内容
 * Parameter   :
 * Returns     :
 * Date        : 2020-04-22 12:20:36
 * Description :
 ******************************************************************************/
u8 *GetAdvData(void)
{
    return ble_adv_data;
}
/*******************************************************************************
 * Function    : SetAdvData
 * Brief       : 设定广播内容
 * Parameter   :
 * Returns     :
 * Date        : 2020-04-22 12:25:51
 * Description :
 ******************************************************************************/
u8 SetAdvData(u8 *data, u8 len)
{
    if (len <= 31)
    {
        // ble_set_adv_type(ADV_HDR_TYPE_PUBLIC_IND); //设定广播类型
        memcpy(ble_adv_data, data, len);
        ble_adv_data[31] = len;
        ble_set_adv_data(ble_adv_data, len); //设定广播包内容
        return 0;
    }
    else
        return 1;
}
/*******************************************************************************
 * Function    : getBleAddr
 * Brief       : 获取MAC地址
 * Parameter   :
 * Returns     :
 * Date        : 2020-04-06 14:56:45
 * Description :
 ******************************************************************************/
u8 *getBleAddr(void)
{
    return ble_mac_addr;
}
/*******************************************************************************
 * Function    : SetBleAddr
 * Brief       :
 * Parameter   :
 * Returns     :
 * Date        : 2020-04-23 17:22:59
 * Description :
 ******************************************************************************/
void SetBleAddr(u8 *addr)
{
    memcpy(ble_mac_addr, addr, 6);
    radio_setBleAddr(addr);
}
/*******************************************************************************
 * Function    :
 * Brief       :
 * Parameter   :
 * Returns     :
 * Date        : 2020-03-23 16:40:53
 * Description : 将MAC地址写入名称字段内
 ******************************************************************************/
void WriteMacAddr(u8 *addr)
{
    //将mac地址写入名称字段内
    DeviceInfo[8] = AHL_Data_Hex2Ascii_4bit(addr[5] >> 4);
    DeviceInfo[9] = AHL_Data_Hex2Ascii_4bit(addr[5] & 0x0f);
    DeviceInfo[10] = AHL_Data_Hex2Ascii_4bit(addr[4] >> 4);
    DeviceInfo[11] = AHL_Data_Hex2Ascii_4bit(addr[4] & 0x0f);
    DeviceInfo[12] = AHL_Data_Hex2Ascii_4bit(addr[3] >> 4);
    DeviceInfo[13] = AHL_Data_Hex2Ascii_4bit(addr[3] & 0x0f);
    DeviceInfo[14] = AHL_Data_Hex2Ascii_4bit(addr[2] >> 4);
    DeviceInfo[15] = AHL_Data_Hex2Ascii_4bit(addr[2] & 0x0f);
    DeviceInfo[16] = AHL_Data_Hex2Ascii_4bit(addr[1] >> 4);
    DeviceInfo[17] = AHL_Data_Hex2Ascii_4bit(addr[1] & 0x0f);
    DeviceInfo[18] = AHL_Data_Hex2Ascii_4bit(addr[0] >> 4);
    DeviceInfo[19] = AHL_Data_Hex2Ascii_4bit(addr[0] & 0x0f);
    DeviceInfo[0] = 19; //名称长度
    ble_set_name(DeviceInfo, 19);
}
/*******************************************************************************
 * Function    : Ble_Init
 * Brief       : 蓝牙初始化
 * Parameter   :
 * Returns     :
 * Date        : 2020-04-03 17:11:42
 * Description :
 ******************************************************************************/
void Ble_Init(void)
{
    u8 *ft_val = (u8 *)(0x1FFFF804);
    u8 ft_value[2] = {0xc0, 0x12};
    u8 *mac_addr;
    u8 res = 0; //操作结果

    SetBleIntRunningMode();
    radio_initBle(TXPWR_0DBM, &mac_addr); //设置发射功率，返回蓝牙Mac地址指针

    res = mconn_SetConnTimeout(150);          // 连接超时，1.5s
    res = mconn_SetConnInterval(16);          // 设置连接间隔，20ms
    ble_master_setTargetDeviceAddr(dev_adva); //设置连接从机地址

    // FT应用
    if ((*ft_val > 11) && (*ft_val < 27))
    {
        ft_value[1] = *ft_val;
        mg_activate(0x53);
        mg_writeBuf(0x4, ft_value, 2);
        mg_activate(0x56);
    }

    SetBleAddr(mac_addr);
    WriteMacAddr(ble_mac_addr); //将MAC地址加入设备名

    ble_set_role(1, 104);     //主机模式，接收窗口
    ble_set_scan(1600, 1600); //扫描窗口，扫描间隔，0.625ms
}
/*******************************************************************************
 * Function    : SendNotifyData
 * Brief       : 蓝牙串口发送数据缓存
 * Parameter   :
 * Returns     :
 * Date        : 2020-04-20 19:27:50
 * Description :
 ******************************************************************************/
void SendNotifyData(u8 *data, u8 len)
{
    u8 i = 0;
    for (i = 0; i < len; i++)
    {
        notify_data[notify_index_in] = data[i];
        notify_index_in++;
        if (notify_index_in >= notify_data_MAX)
            notify_index_in = 0;
    }
}
/*******************************************************************************
 * Function    : NotifyRun
 * Brief       : 蓝牙串口发送数据
 * Parameter   :
 * Returns     :
 * Date        : 2020-04-20 18:56:01
 * Description :
 ******************************************************************************/
void NotifyRun(void)
{
    u8 length = 0, i = 0;
    u8 data[20];
    if (GetConnectedStatus() == 0)
    {
        notify_index_out = notify_index_in;
        return;
    }

    if (notify_index_in > notify_index_out)
        length = notify_index_in - notify_index_out;
    else if (notify_index_in == notify_index_out)
        return;
    else
        length = notify_data_MAX - notify_index_out + notify_index_in;

    if (length >= 20)
        length = 20;

    //取字节发送
    for (i = 0; i < length; i++)
    {
        data[i] = notify_data[notify_index_out];
        notify_index_out++;
        if (notify_index_out >= notify_data_MAX)
            notify_index_out = 0x00;
    }

    if (GetConnectedStatus() == 1)
    { //从机模式

        setNotifyHandle(getBleUartRxHandle()); //调用sconn_notifydata函数前一定要设定正确的句柄
        sconn_notifydata(data, length);
    }
    else if (GetConnectedStatus() == 2)
    { //主机模式

        cli_write_req(0x0015, data, length); // 0x0010是从机的write通讯句柄
    }
}
